package core_sql.day07_sql

import java.lang.Long

import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}

/**
  * 自定义函数分为三类
  * 1：UDF  一对一
  * 2：UDAF 多对一    （多行返回一个结果）
  * 3：UDTF 一对多     （炸裂函数，在spark中是不需要的，flat已经搞定了）
  *
  * 使用的时候只需要实现函数，然后进行注册就可以使用了
  * DSL 风格不需要注册
  */
object UDAF_UDF {
  def main(args: Array[String]): Unit = {
    val session = SparkSession.builder()
      .appName("SQLIPLocation")
      .master("local[*]")
      .getOrCreate()


    val range: Dataset[Long] = session.range(1, 10)
    //注册udaf     如果是udf则直接使用函数注册就可以了
    val geoMean = new GeoMean
    session.udf.register("gm",geoMean)
    val df: DataFrame = session.sql("SELECT gm(id) geo_mean FROM v_range")


    // DSL(不需要注册函数了)
   /* import session.implicits._
    val df = range.groupBy().agg(geoMean($"id") as "geo_mean")*/

    import session.implicits._
  }

}
